package main

import (
	"fmt"
	"os"
	"os/signal"
	"syscall"
	"time"

	"github.com/gin-gonic/gin"

	// "GinAdmin/internal/config"
	"GinAdmin/core/auth"
	"GinAdmin/core/config"
	"GinAdmin/core/database"
	"GinAdmin/core/jwt"
	"GinAdmin/core/logger"
	"GinAdmin/migration"
	"GinAdmin/router"
)

func main() {
	// 初始化配置
	// cfg, err := config.InitConfig()
	err := config.InitConfig("configs")
	if err != nil {
		fmt.Printf("初始化配置失败: %v\n", err)
		os.Exit(1)
	}

	// 设置Gin模式
	// gin.SetMode(cfg.Server.Mode)
	gin.SetMode(config.ServerConfig.Mode)

	// 初始化日志
	// logger.InitLogger(cfg.Server.LogLevel)
	logger.InitLogger(config.LogConfig.Level)
	logger.Info("服务启动中...")

	// 初始化JWT
	jwt.DefaultGuard = jwt.NewTokenGuard(jwt.Config{
		SigningKey:  config.ServerConfig.JWTSecret,
		ExpiresTime: time.Duration(config.ServerConfig.JWTExpire) * time.Hour,
		Issuer:      "GinAdmin",
	})
	logger.Info("JWT初始化成功")

	// 初始化数据库
	dsn := fmt.Sprintf("sqlserver://%s:%s@%s:%d?database=%s",
		// cfg.Database.User,
		// cfg.Database.Password,
		// cfg.Database.Host,
		// cfg.Database.Port,
		// cfg.Database.DBName)
		config.DBConfig.Username,
		config.DBConfig.Password,
		config.DBConfig.Host,
		config.DBConfig.Port,
		config.DBConfig.DBName)

	// database.InitDB(dsn, cfg.Database.MaxIdleConns, cfg.Database.MaxOpenConns)
	database.InitDB(dsn, config.DBConfig.MaxIdleConns, config.DBConfig.MaxOpenConns)
	defer database.Close()
	logger.Info("数据库连接成功")

	// 初始化Casbin
	if err := auth.InitCasbin(); err != nil {
		logger.Error("Casbin初始化失败: %v", err)
		return
	}
	logger.Info("Casbin初始化成功")

	// 执行数据库迁移
	if err := migration.RunMigration(); err != nil {
		logger.Error("数据库迁移失败: %v", err)
		return
	}
	logger.Info("数据库迁移完成")

	// 初始化路由
	r := router.InitRouter(config.ServerConfig.Mode)
	logger.Info("路由初始化完成")

	// 启动服务器
	go func() {
		// addr := fmt.Sprintf(":%d", cfg.Server.Port)
		addr := fmt.Sprintf(":%d", config.ServerConfig.Port)
		logger.Info("服务器启动在 %s", addr)
		if err := r.Run(addr); err != nil {
			logger.Fatal("服务器启动失败: %v", err)
		}
	}()

	// 等待中断信号优雅关闭服务器
	quit := make(chan os.Signal, 1)
	signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
	<-quit

	logger.Info("正在关闭服务器...")
	logger.Info("服务器已关闭")
}
